package com.foodorder.repository;

import com.foodorder.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 用户数据访问接口
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    /**
     * 根据邮箱查找用户
     */
    Optional<User> findByEmail(String email);
    
    /**
     * 检查邮箱是否存在
     */
    boolean existsByEmail(String email);
    
    /**
     * 根据微信OpenID查找用户
     */
    Optional<User> findByWxOpenId(String wxOpenId);
    
    /**
     * 检查微信OpenID是否存在
     */
    boolean existsByWxOpenId(String wxOpenId);
    
    /**
     * 根据邮箱和状态查找用户
     */
    Optional<User> findByEmailAndStatus(String email, User.UserStatus status);
    
    /**
     * 计算两点之间的距离（使用Haversine公式）
     */
    @Query(value = "SELECT (6371 * acos(cos(radians(:lat1)) * cos(radians(u.latitude)) * " +
                   "cos(radians(u.longitude) - radians(:lon1)) + sin(radians(:lat1)) * " +
                   "sin(radians(u.latitude)))) AS distance " +
                   "FROM users u WHERE u.id = :userId", nativeQuery = true)
    Double calculateDistanceFromUser(@Param("userId") Long userId, 
                                   @Param("lat1") Double latitude, 
                                   @Param("lon1") Double longitude);
    
    /**
     * 统计指定状态的用户数量
     */
    long countByStatus(User.UserStatus status);
    
    /**
     * 统计指定时间后创建的用户数量
     */
    long countByCreatedAtAfter(java.time.LocalDateTime dateTime);
    
    /**
     * 统计指定时间前创建的用户数量
     */
    long countByCreatedAtBefore(java.time.LocalDateTime dateTime);
    
    /**
     * 统计指定时间范围内创建的用户数量
     */
    long countByCreatedAtBetween(java.time.LocalDateTime start, java.time.LocalDateTime end);
    
    /**
     * 根据昵称或邮箱模糊查询用户（分页）
     */
    Page<User> findByNicknameContainingOrEmailContaining(String nickname, String email, Pageable pageable);
    
    /**
     * 根据状态查询用户（分页）
     */
    Page<User> findByStatus(User.UserStatus status, Pageable pageable);
} 